// 文件路径: dbms/service/Response.java
package com.dbms.service;

import com.dbms.common.QueryResult;
import java.io.Serializable;

/**
 * 服务器向客户端发送响应的数据传输对象（DTO）。
 * <p>
 * 这个类是可序列化的，用于通过网络将服务器端的处理结果返回给客户端。
 * 它封装了操作是否成功、相关消息、查询结果数据，以及更新后的会话状态
 * （如当前用户和事务状态），以便客户端能够同步其状态。
 */
public class Response implements Serializable {
    /**
     * 序列化版本UID，用于确保客户端和服务器使用的类版本兼容。
     */
    private static final long serialVersionUID = 2L;

    /**
     * 标志操作是否成功。
     */
    private final boolean isSuccess;
    /**
     * 描述操作结果的消息字符串，例如 "Query returned 5 tuples." 或 "ERROR: Table not found."。
     */
    private final String message;
    /**
     * 封装了查询的详细结果，包括Schema和元组列表。对于非查询操作，可能为null。
     */
    private final QueryResult queryResult;
    /**
     * 操作执行后，服务器侧的当前用户名。用于在客户端同步显示。
     */
    private final String currentUser;
    /**
     * 操作执行后，服务器侧的当前事务状态。用于在客户端同步显示。
     */
    private final boolean inTransaction;

    /**
     * Response 的构造函数。
     *
     * @param isSuccess     操作是否成功。
     * @param message       结果消息。
     * @param queryResult   查询结果对象。
     * @param currentUser   当前用户名。
     * @param inTransaction 当前是否在事务中。
     */
    public Response(boolean isSuccess, String message, QueryResult queryResult, String currentUser, boolean inTransaction) {
        this.isSuccess = isSuccess;
        this.message = message;
        this.queryResult = queryResult;
        this.currentUser = currentUser;
        this.inTransaction = inTransaction;
    }

    // --- Getters ---
    // 以下是所有私有字段的公共获取方法。

    /**
     * 检查操作是否成功。
     * @return 如果成功则返回 true。
     */
    public boolean isSuccess() { return isSuccess; }

    /**
     * 获取结果消息。
     * @return 消息字符串。
     */
    public String getMessage() { return message; }

    /**
     * 获取详细的查询结果。
     * @return {@link QueryResult} 对象。
     */
    public QueryResult getQueryResult() { return queryResult; }

    /**
     * 获取当前用户名。
     * @return 用户名字符串。
     */
    public String getCurrentUser() { return currentUser; }

    /**
     * 检查是否处于事务中。
     * @return 如果在事务中则返回 true。
     */
    public boolean isInTransaction() { return inTransaction; }
}